inspector: Fix surface transform regression
authorMatthias Clasen <mclasen@redhat.com>
Tue, 9 Mar 2021 22:42:59 +0000 (17:42 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 9 Mar 2021 23:27:04 +0000 (18:27 -0500)
Ever since we added surface-to-widget transforms,
the autofading of the fps overlay did not work anymore,
since it was given the transient transform node, most
of the time.

Fix this by passing both the root of the node tree and
the node for the toplevel widget to prepare_render, and
hande the widget node to the overlays. Update the
affected overlays that need to have their positioning
adjusted.

gtk/gtkwidget.c
gtk/inspector/updatesoverlay.c
gtk/inspector/window.c
gtk/inspector/window.h

index 35a695e0807063d7056f5ea316714cc9bcadb2c8..60bcb9d5335e97353c6bdf1e3bc698d1ae6f18c6 100644 (file)
@@ -11462,6 +11462,7 @@ gtk_widget_render (GtkWidget            *widget,
                    GdkSurface           *surface,
                    const cairo_region_t *region)
 {
+  GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
   GtkSnapshot *snapshot;
   GskRenderer *renderer;
   GskRenderNode *root;
@@ -11497,7 +11498,8 @@ gtk_widget_render (GtkWidget            *widget,
                                            renderer,
                                            surface,
                                            region,
-                                           root);
+                                           root,
+                                           priv->render_node);
 
       gsk_renderer_render (renderer, root, region);
 
index cac2a1c4f3d12a7fb2d22a8a129ff9a357cc5bb2..828f7c662c3fa3fa10bd8130bbd6df34c706e143 100644 (file)
@@ -172,15 +172,10 @@ gtk_updates_overlay_snapshot (GtkInspectorOverlay *overlay,
   GtkUpdate *draw;
   gint64 now;
   GList *l;
-  double native_x, native_y;
 
   if (!GTK_IS_NATIVE (widget))
     return;
 
-  /* The coordinates we're getting from GdkSurface API are in GdkSurface coordinate spaces,
-   * but we're snapshotting in widget space, so we need to transform */
-  gtk_native_get_surface_transform (GTK_NATIVE (widget), &native_x, &native_y);
-
   updates = gtk_update_overlay_lookup_for_widget (self, widget, TRUE);
   now = gdk_frame_clock_get_frame_time (gtk_widget_get_frame_clock (widget));
 
@@ -234,7 +229,7 @@ gtk_updates_overlay_snapshot (GtkInspectorOverlay *overlay,
           cairo_region_get_rectangle (draw->region, i, &rect);
           gtk_snapshot_append_color (snapshot,
                                      &(GdkRGBA) { 1, 0, 0, 0.4 * (1 - progress) },
-                                     &GRAPHENE_RECT_INIT(rect.x - native_x, rect.y - native_y,
+                                     &GRAPHENE_RECT_INIT(rect.x, rect.y,
                                                          rect.width, rect.height));
         }
     }
index 61b3a9aed9503a152a52a14da2bed4109ec3f198..3f0d8c031d347ce5e7a0b14c860460f9ed2f5e61 100644 (file)
@@ -780,24 +780,25 @@ gtk_inspector_prepare_render (GtkWidget            *widget,
                               GskRenderer          *renderer,
                               GdkSurface           *surface,
                               const cairo_region_t *region,
-                              GskRenderNode        *node)
+                              GskRenderNode        *root,
+                              GskRenderNode        *widget_node)
 {
   GtkInspectorWindow *iw;
 
   iw = gtk_inspector_window_get_for_display (gtk_widget_get_display (widget));
   if (iw == NULL)
-    return node;
+    return root;
 
   /* sanity check for single-display GDK backends */
   if (GTK_WIDGET (iw) == widget)
-    return node;
+    return root;
 
   gtk_inspector_recorder_record_render (GTK_INSPECTOR_RECORDER (iw->widget_recorder),
                                         widget,
                                         renderer,
                                         surface,
                                         region,
-                                        node);
+                                        root);
 
   if (iw->overlays)
     {
@@ -806,7 +807,7 @@ gtk_inspector_prepare_render (GtkWidget            *widget,
       double native_x, native_y;
 
       snapshot = gtk_snapshot_new ();
-      gtk_snapshot_append_node (snapshot, node);
+      gtk_snapshot_append_node (snapshot, root);
 
       gtk_native_get_surface_transform (GTK_NATIVE (widget), &native_x, &native_y);
 
@@ -815,16 +816,16 @@ gtk_inspector_prepare_render (GtkWidget            *widget,
 
       for (l = iw->overlays; l; l = l->next)
         {
-          gtk_inspector_overlay_snapshot (l->data, snapshot, node, widget);
+          gtk_inspector_overlay_snapshot (l->data, snapshot, widget_node, widget);
         }
 
       gtk_snapshot_restore (snapshot);
 
-      gsk_render_node_unref (node);
-      node = gtk_snapshot_free_to_node (snapshot);
+      gsk_render_node_unref (root);
+      root = gtk_snapshot_free_to_node (snapshot);
     }
 
-  return node;
+  return root;
 }
 
 gboolean
index 5d860b2f76aba26a7a667f74ecfbfd55966aac18..90841a8ae42fd80bcab69bc9bdcc82634c252c28 100644 (file)
@@ -154,7 +154,8 @@ GskRenderNode *         gtk_inspector_prepare_render
                                                                                  GskRenderer            *renderer,
                                                                                  GdkSurface             *surface,
                                                                                  const cairo_region_t   *region,
-                                                                                 GskRenderNode          *node);
+                                                                                 GskRenderNode          *root,
+                                                                                 GskRenderNode          *widget_node);
 gboolean                gtk_inspector_handle_event                              (GdkEvent               *event);
 
 G_END_DECLS